Conv2DBackpropFilterFusion
计算二维卷积反向传播的权重梯度(Conv2D backprop filter fusion),支持常规卷积、Depthwise 卷积以及 1x1 优化路径,多核按批次与空间维度分块协同完成。
\[dw = \text{Conv2DGradFilter}(x, dy)\]
- 输入:
dy - 输出梯度张量首地址,形状
[batch, out_h, out_w, out_channel]。x - 正向输入张量首地址,形状
[batch, in_h, in_w, in_channel]。conv_param - 卷积参数结构体地址,包含
stride、pad、dilation、group、输入输出维度及共享工作空间指针等信息。ConvParameter 字段说明:
workspace_- 指向算子运行时使用的临时工作空间,需满足对齐与容量要求。
output_batch_- 输出梯度dy的批次数(通常等于输入批次数)。
input_batch_- 正向输入x的批次数,用于与output_batch_校验。
input_h_/input_w_- 正向输入特征图的高度与宽度。
output_h_/output_w_- 输出梯度特征图的高度与宽度。
input_channel_/output_channel_- 输入与输出通道数,需与group_配合满足整除关系。
kernel_h_/kernel_w_- 卷积核的高与宽。
group_- 组卷积数量,group_ = 1表示普通卷积。
pad_l_/pad_r_/pad_u_/pad_d_- 分别表示左右上下方向的填充大小。
dilation_h_/dilation_w_- 核心采样间隔(膨胀系数)。
stride_h_/stride_w_- 滑动窗口在高、宽方向的步长。
buffer_size_- 分配给workspace_的缓冲区字节数,在运行前需要正确设置。
nweights_- 卷积权重w的元素总数,用于内部分块和校验。core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。
- 输出:
dw - 卷积核梯度张量首地址,形状
[out_channel, in_channel/group, kernel_h, kernel_w]。- 支持平台:
FT78NEMT7004备注
FT78NE 支持 fp32 数据类型。
MT7004 支持 fp16、fp32 数据类型。
需在
conv_param->workspace_中预先分配共享工作空间,长度不少于conv_param->buffer_size_。
共享存储版本:
-
void hp_conv2dbackpropfilterfusion_s(const half *dy, const half *x, half *dw, ConvParameter *conv_param, int core_mask)
-
void fp_conv2dbackpropfilterfusion_s(const float *dy, const float *x, float *dw, ConvParameter *conv_param, int core_mask)
C调用示例:
1// FT78NE 多核示例 2#include <stdio.h> 3#include "conv_parameter.h" 4 5int main(void) { 6 const float *dy = (const float *)0xA0000000; // DDR 存储 7 const float *x = (const float *)0xB0000000; 8 float *dw = (float *)0xC0000000; 9 ConvParameter *param = (ConvParameter *)0xB0001000; 10 // 设置 ConvParameter 字段 11 param->workspace_ = (void *)0xB0002000; 12 param->buffer_size_ = 0x20000; 13 param->input_batch_ = 1; 14 param->input_h_ = 3; 15 param->input_w_ = 3; 16 param->input_channel_ = 4; 17 param->output_batch_ = 1; 18 param->output_h_ = 3; 19 param->output_w_ = 3; 20 param->output_channel_ = 4; 21 param->kernel_h_ = 2; 22 param->kernel_w_ = 2; 23 param->group_ = 2; 24 param->pad_u_ = 1; 25 param->pad_d_ = 0; 26 param->pad_l_ = 1; 27 param->pad_r_ = 0; 28 param->dilation_h_ = 1; 29 param->dilation_w_ = 1; 30 param->stride_h_ = 1; 31 param->stride_w_ = 1; 32 param->nweights_ = 4 * 2 * 2 * 2; // 示例值 33 int core_mask = 0xff; 34 fp_conv2dbackpropfilterfusion_s(dy, x, dw, param, core_mask); 35 return 0; 36}
私有存储版本:
-
void hp_conv2dbackpropfilterfusion_p(const half *dy, const half *x, half *dw, ConvParameter *conv_param)
-
void fp_conv2dbackpropfilterfusion_p(const float *dy, const float *x, float *dw, ConvParameter *conv_param)
C调用示例:
1// MT7004 单核示例 2#include <stdio.h> 3#include "conv_parameter.h" 4 5int main(void) { 6 const half *dy = (const half *)0x10000000; // L2 存储 7 const half *x = (const half *)0x10020000; 8 half *dw = (half *)0x10040000; 9 ConvParameter *param = (ConvParameter *)0x10060000; 10 // 设置 ConvParameter 字段 11 param->workspace_ = (void *)0x10070000; 12 param->buffer_size_ = 0x10000; 13 param->input_batch_ = 1; 14 param->input_h_ = 3; 15 param->input_w_ = 3; 16 param->input_channel_ = 4; 17 param->output_batch_ = 1; 18 param->output_h_ = 3; 19 param->output_w_ = 3; 20 param->output_channel_ = 4; 21 param->kernel_h_ = 2; 22 param->kernel_w_ = 2; 23 param->group_ = 2; 24 param->pad_u_ = 1; 25 param->pad_d_ = 0; 26 param->pad_l_ = 1; 27 param->pad_r_ = 0; 28 param->dilation_h_ = 1; 29 param->dilation_w_ = 1; 30 param->stride_h_ = 1; 31 param->stride_w_ = 1; 32 param->nweights_ = 4 * 2 * 2 * 2; // 示例值 33 hp_conv2dbackpropfilterfusion_p(dy, x, dw, param); 34 return 0; 35}